package Class对象功能的演示;

import reflect中Class对象的创建.Person;

import java.lang.reflect.Field;

/**
 * @Auther:云尚学Java
 * 获取成员变量
 */
public class ReflectDemo1 {
    public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
        //2.类名.class:通过类名的属性class获取
        Class personClass= Person.class;
        System.out.println("2："+personClass);
        /**
         * 一、获取公有成员变量
         * * Field[] getFields() ：获取所有public修饰的成员变量
         * * Field getField(String name)   获取指定名称的 public修饰的成员变量
         * *
         */
        Field[] fields = personClass.getFields();//存储就是Person类下所有public修饰的成员变量
        for (Field field : fields) {
            System.out.println(field);
        }

        System.out.println("==========");
        Field b = personClass.getField("b");
        System.out.println(b);
        System.out.println("==========");
        /**
         * 对于获取的b变量有什么作用呢？
         *
         * 变量本身的作用：
         *         赋值
         *         取值
         */
        Person person=new Person();
        //Object value = b.get(person);
        //System.out.println("value:"+value);   //null

        b.set(person,"云尚");   //通过反射动态赋值
        Object value = b.get(person);
        System.out.println("value:"+value);     //云尚

        /**
         * 二、获取的成员变量不考虑修饰符
         * Field[] getDeclaredFields()  获取所有的成员变量，不考虑修饰符
         * * * Field getDeclaredField(String name)
         */
        System.out.println("==========");
        Field[] declaredFields = personClass.getDeclaredFields();
        for (Field declaredField : declaredFields) {
            System.out.println(declaredField);
        }

        System.out.println("==========");
        Field age = personClass.getDeclaredField("age");
        System.out.println(age);

        System.out.println("==========");
        //------暴力反射
        age.setAccessible(true);   //需要操作私有，请求放行
        Object value1 = age.get(person);
        System.out.println("age:"+value1);
        //异常：Class Class对象功能的演示.ReflectDemo1 can not access a member of class reflect中Class对象的创建.Person with modifiers "private"
        //需要加age.setAccessible(true);方法

        age.set(person,18);
        Object value2 = age.get(person);
        System.out.println(value2);

    }
}
